package linkedlist.leetcode_2;

/**
 * 两数相加
 */
public class addTwoNumbers {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        if (l1 == null && l2 == null) {
            return null;
        }
        //定义哑节点
        ListNode dummyNode = new ListNode(-1);
        //定义前驱节点遍历链表
        ListNode prevNode = dummyNode;
        //定义进位标志 1 -> 有进位 0 -> 无进位
        int addOne = 0;

        while (l1 != null || l2 != null) {
            //为短链表进行补0操作
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;

            //每一次遍历都要 加上 之前是否有进位
            int sum = x + y + addOne;

            //每一次遍历都记录是否有进位
            addOne = sum / 10;

            //将实际数值放入链表
            //7 + 8 = 15 进位为 1 实际值为 5
            sum = sum % 10;
            prevNode.next = new ListNode(sum);
            prevNode = prevNode.next;

            //要进行补0操作，防止nullPointer
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        //如果遍历完毕后，addOne进位还为1，加入到链表
        if (addOne == 1) {
            prevNode.next = new ListNode(addOne);
        }
        return dummyNode.next;
    }
}
